home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 051-060 / amok56 / m2maker / txt / routines.mod < prev    next >
Text File  |  1993-11-04  |  29KB  |  983 lines

  1. (*---------------------------------------------------------------------------
  2.   :Program.    m2Maker
  3.   :Author.     Thomas Stolze
  4.   :Address.    Goslarsche Str. 32, 3000 Hannover 21, Germany
  5.   :Phone.      (0)511 / 75 10 77
  6.   :Version.    V2.0
  7.   :Date.       16-Nov-90
  8.   :Copyright.  Shareware
  9.   :Language.   Modula-2
  10.   :Translator. M2Amiga V3.32d
  11.   :Contents.   Programming Utility.
  12.   :Remark.     Supports the M2Amiga System (C) by A+L AG Switzerland
  13. ----------------------------------------------------------------------------*)
  14.  
  15. IMPLEMENTATION MODULE Routines;
  16.  
  17. IMPORT ExecD;
  18. IMPORT IntuitionL;
  19. IMPORT String;
  20.  
  21. FROM Arts            IMPORT Assert,BreakPoint;
  22. FROM ASCII           IMPORT lf;
  23. FROM Conversions     IMPORT ValToStr;
  24. FROM DosD            IMPORT accessRead,FileLockPtr,Date;
  25. FROM DosL            IMPORT CurrentDir,Delay,DeleteFile,Execute,
  26.                             Input,IoErr,Lock,Output,Rename,UnLock;
  27. FROM ExecD           IMPORT IOStdReqPtr,Message,MsgPortPtr;
  28. FROM ExecL           IMPORT CloseDevice,CopyMem,DoIO,FindPort,GetMsg,
  29.                             OpenDevice,PutMsg,ReplyMsg,WaitPort,Forbid,Permit;
  30. FROM ExecSupport     IMPORT CreatePort,CreateStdIO,DeletePort,DeleteStdIO;
  31. FROM FileRequester   IMPORT LoadDir,RefreshDisplay;
  32. FROM FileSystem      IMPORT Close,Delete,File,Lookup,ReadChar,Response,
  33.                             WriteBytes,WriteChar;
  34. FROM GraphicsD       IMPORT jam2,RastPortPtr;
  35. FROM GraphicsL       IMPORT RectFill,SetAPen,SetDrMd;
  36. FROM Input           IMPORT inputName,writeEvent;
  37. FROM InputEvent      IMPORT InputEvent,Class,Qualifiers,QualifierSet;
  38. FROM InitIntuition   IMPORT prgPtr,PrintStatus,RefreshDrawings,
  39.                             windowHeight;
  40. FROM IntuitionD      IMPORT GadgetFlags,GadgetFlagSet,
  41.                             IntuitionBasePtr,MenuItemFlags,
  42.                             MenuItemFlagSet,ScreenPtr,WindowPtr;
  43. FROM IntuitionL      IMPORT ActivateGadget,ActivateWindow,AddGadget,
  44.                             BeginRefresh,
  45.                             ClearMenuStrip,DisplayBeep,EndRefresh,
  46.                             LockIBase,
  47.                             MoveWindow,OffMenu,OnMenu,
  48.                             RefreshGadgets,RefreshGList,RemoveGadget,
  49.                             ScreenToFront,SetMenuStrip,SizeWindow,UnlockIBase,
  50.                             WBenchToFront,WindowToFront,
  51.                             AddGList,RemoveGList;
  52. FROM RequesterWindow IMPORT DeleteFileRequester,RenameFileRequester,
  53.                 M2EmacsRequester,M2LErrorRequester;
  54. FROM String          IMPORT Compare,Concat,Copy,LastPos,Length,Occurs;
  55. FROM SYSTEM          IMPORT ADDRESS,ADR,CAST,LONGSET;
  56. FROM XCopy           IMPORT XCopy,XType,GetFileDosDate;
  57.  
  58. (*FROM InOut IMPORT WriteInt,WriteString,WriteLn;*)
  59.  
  60. TYPE TrojaPtr = POINTER TO Troja;
  61.      Troja    = RECORD
  62.                   msg    : Message;
  63.                   ptr    : ADDRESS;      (* to memory *)
  64.                   dum,                   (* unknown   *)
  65.                   path   : ADDRESS;      (* Path      *);
  66.                 END;
  67.  
  68. TYPE InEvent  = RECORD
  69.                   news  : Message;
  70.                   event : InputEvent;
  71.                 END;
  72.  
  73. TYPE EditorCondition = (correct,notchanged,changed);
  74.  
  75. VAR projectLock,
  76.     lock        : FileLockPtr;
  77.     bigWindow   : BOOLEAN;
  78.     inputPort,
  79.     ReplyPort   : MsgPortPtr;
  80.     inReqPtr    : IOStdReqPtr;
  81.     news        : InputEvent;
  82.     file        : File;
  83.  
  84. PROCEDURE Block(rport : RastPortPtr; col,x1,y1,x2,y2 : INTEGER);
  85. BEGIN
  86.   SetAPen(rport,col); SetDrMd(rport,jam2); RectFill(rport,x1,y1,x2,y2);
  87. END Block;
  88.  
  89. PROCEDURE SwitchGadget(on : BOOLEAN; id : INTEGER);
  90. VAR pos  : INTEGER;
  91. BEGIN
  92.   pos:=RemoveGadget(prgPtr^.window,ADR(prgPtr^.GadgetArray[id]));
  93.   IF on THEN
  94.      INCL(prgPtr^.GadgetArray[id].flags,selected)
  95.   ELSE
  96.      EXCL(prgPtr^.GadgetArray[id].flags,selected)
  97.   END;
  98.   WITH prgPtr^.GadgetArray[id] DO
  99.     Block(prgPtr^.window^.rPort,prgPtr^.GadgetArray[id].gadgetText^.backPen,
  100.           leftEdge,topEdge,leftEdge+width-1,topEdge+height-1);
  101.   END;
  102.   pos:=AddGadget(prgPtr^.window,ADR(prgPtr^.GadgetArray[id]),pos);
  103.   RefreshGList(ADR(prgPtr^.GadgetArray[id]),prgPtr^.window,NIL,1);
  104. END SwitchGadget;
  105.  
  106. PROCEDURE GetDosErr;
  107. VAR err  : LONGINT;
  108.     str  : ARRAY [0..30] OF CHAR;
  109.     num  : ARRAY [0.. 4] OF CHAR;
  110.     bool : BOOLEAN;
  111. BEGIN
  112.   err:=IoErr();
  113.   CASE err OF
  114.     100..231,233..500:
  115.        str:=("DOS Error: "); ValToStr(err,FALSE,num,10,4," ",bool);
  116.        Concat(str,num); PrintStatus(str);
  117.   ELSE
  118.      PrintStatus("Ok.");
  119.   END;
  120. END GetDosErr;
  121.  
  122. PROCEDURE TestForFile(name : ADDRESS): BOOLEAN;
  123. VAR lock : FileLockPtr;
  124. BEGIN
  125.   lock:=Lock(name,accessRead);
  126.   IF lock # NIL THEN UnLock(lock); RETURN TRUE ELSE RETURN FALSE END;
  127. END TestForFile;
  128.  
  129. PROCEDURE TestForProject(pjt,dir : ARRAY OF CHAR; VAR result : ARRAY OF CHAR);
  130. VAR test : ARRAY [0..255] OF CHAR;
  131. BEGIN
  132.   Copy(test,pjt); Concat(test,dir);
  133.   IF TestForFile(ADR(test)) THEN Copy(result,test); ELSE Copy(result,pjt) END;
  134. END TestForProject;
  135.  
  136. PROCEDURE MakePath(dir,file : ARRAY OF CHAR; VAR path : ARRAY OF CHAR);
  137. VAR i : INTEGER;
  138. BEGIN
  139.   i:=Length(dir); Copy(path,dir);
  140.   IF i > 0 THEN
  141.      IF (path[i-1] # ":") AND (path[i-1] # "/") THEN Concat(path,"/") END;
  142.   END;
  143.   Concat(path,file);
  144. END MakePath;
  145.  
  146. PROCEDURE FilterLastDir(str : ARRAY OF CHAR; VAR dir : ARRAY OF CHAR);
  147. VAR i,j,k : INTEGER;
  148. BEGIN
  149.    i:=Length(str); j:=0; k:=0;
  150.    REPEAT DEC(i) UNTIL ((i < 0) OR (str[i] = ":")) OR (str[i] = "/");
  151.  
  152.    FOR k:=i+1 TO Length(str) DO dir[j]:=str[k]; INC(j); END;
  153.  
  154.    MakePath(dir,"",dir);
  155. END FilterLastDir;
  156.  
  157. PROCEDURE MakeExecuteStr(str,insert : ARRAY OF CHAR; VAR exec : ARRAY OF CHAR);
  158. VAR i,j,k : INTEGER;
  159.     file  : ARRAY [0..31] OF CHAR;
  160. BEGIN
  161.   i:=0; j:=0; k:=0;
  162.   REPEAT
  163.     CASE str[i] OF
  164.       "#": IF str[i+1] # "?" THEN
  165.               exec[j]:=str[i]; INC(i); INC(j);
  166.            ELSE
  167.               INC(i,2);
  168.               REPEAT
  169.                 exec[j]:=insert[k]; INC(j); INC(k);
  170.               UNTIL (insert[k] = 00C) OR (j > HIGH(exec));
  171.            END;
  172.     | "*": FilterLastDir(insert,file); INC(k,Length(insert)-Length(file)+1);
  173.            INC(i,1);
  174.               REPEAT
  175.                 exec[j]:=insert[k]; INC(j); INC(k);
  176.               UNTIL (insert[k] = 00C) OR (j > HIGH(exec));
  177.     ELSE
  178.       exec[j]:=str[i]; INC(i); INC(j);
  179.     END;
  180.   UNTIL (str[i-1] = 00C) OR (j > HIGH(exec));
  181.   exec[j-1]:=00C;
  182. END MakeExecuteStr;
  183.  
  184. PROCEDURE ExecuteStr(exec : ADDRESS);
  185. VAR err : LONGINT;
  186. BEGIN
  187.   err:=Execute(exec,NIL,NIL);
  188.   IF err # 0 THEN GetDosErr ELSE PrintStatus("Ok.") END;
  189. END ExecuteStr;
  190.  
  191. PROCEDURE DeleteAFile;
  192. VAR bool    : BOOLEAN;
  193.     delete  : ARRAY [0..255] OF CHAR;
  194. BEGIN
  195.   IF DeleteFileRequester(prgPtr^.FR.file) THEN
  196.      MakePath(prgPtr^.FR.dirPath,prgPtr^.FR.file,delete);
  197.      IF NOT DeleteFile(ADR(delete)) THEN GetDosErr ELSE PrintStatus("Ok.") END;
  198.         Concat(delete,".info");
  199.      bool:=DeleteFile(ADR(delete));
  200.      prgPtr^.FR.file:="";
  201.      LoadDir(ADR(prgPtr^.FR));
  202.   END;
  203. END DeleteAFile;
  204.  
  205. PROCEDURE RenameAFile;
  206. VAR bool    : BOOLEAN;
  207.     oldName : ARRAY [0..31] OF CHAR;
  208.     rename,
  209.     oldPath : ARRAY [0..255] OF CHAR;
  210. BEGIN
  211.   Copy(oldName,prgPtr^.FR.file);
  212.   MakePath(prgPtr^.FR.dirPath,prgPtr^.FR.file,oldPath);
  213.   IF RenameFileRequester(prgPtr^.FR.file) THEN
  214.      MakePath(prgPtr^.FR.dirPath,prgPtr^.FR.file,rename);
  215.      IF NOT Rename(ADR(oldPath),ADR(rename)) THEN
  216.         GetDosErr ELSE PrintStatus("Ok.");
  217.      END;
  218.         Concat(oldPath,".info"); Concat(rename,".info");
  219.      bool:=Rename(ADR(oldPath),ADR(rename));
  220.      prgPtr^.FR.file:="";
  221.      LoadDir(ADR(prgPtr^.FR));
  222.   ELSE
  223.      Copy(prgPtr^.FR.file,oldName);
  224.   END;
  225. END RenameAFile;
  226.  
  227. PROCEDURE StartModuleTool;
  228. VAR dummy,
  229.     path   : ARRAY [0..255] OF CHAR;
  230. BEGIN
  231.   SwitchGadget(TRUE,19);
  232.    dummy:=("M2:ModuleTOOL "); MakePath(prgPtr^.FR.dirPath,prgPtr^.FR.file,path);
  233.    Concat(dummy,path); ExecuteStr(ADR(dummy));
  234.   SwitchGadget(FALSE,19);
  235. END StartModuleTool;
  236.  
  237. PROCEDURE FindEditor(): ScreenPtr;
  238. VAR base   : IntuitionBasePtr;
  239.     screen : ScreenPtr;
  240.     name   : ARRAY [0..23] OF CHAR;
  241.     ilock  : LONGCARD;
  242. BEGIN
  243.   base:=ADR(IntuitionL);
  244.   ilock:=LockIBase(0);
  245.     screen:=base^.firstScreen;
  246.   UnlockIBase(ilock);
  247.  
  248.   WHILE (screen # NIL) DO
  249.     CopyMem(screen^.title,ADR(name),22); name[22]:=00C;
  250.     IF Compare("Amiga Modula-2 Editor,",name) = 0 THEN
  251.        RETURN screen;
  252.     ELSE
  253.        screen:=screen^.nextScreen;
  254.     END;
  255.   END;
  256.   RETURN NIL;
  257. END FindEditor;
  258.  
  259. PROCEDURE Editor;
  260. VAR file,
  261.     dummy : ARRAY [0..255] OF CHAR;
  262.     resid : ARRAY [0..150] OF CHAR;
  263.     pos   : INTEGER;
  264.     s     : ScreenPtr;
  265. BEGIN
  266.   SwitchGadget(TRUE,4); PrintStatus("Started Editor !"); file:=("");
  267.   s:=FindEditor();
  268.  
  269.   IF s = NIL THEN
  270.      Copy(resid,prgPtr^.BufferString[4]);
  271.      IF (checked IN prgPtr^.MenuArray[27].flags) THEN
  272.          pos:=Occurs(resid,0,"M2:",FALSE);
  273.          IF pos > -1 THEN String.Delete(resid,0,3); Delay(10) END;
  274.      END;
  275.      MakePath(prgPtr^.FR.dirPath,prgPtr^.FR.file,file);
  276.      MakeExecuteStr(resid,file,dummy);
  277.  
  278.      IF (checked IN prgPtr^.MenuArray[16].flags) THEN
  279.         Copy(file,dummy); dummy:=("Run "); Concat(dummy,file);
  280.      END;
  281.  
  282.      ExecuteStr(ADR(dummy));
  283.   ELSE
  284.      ScreenToFront(s);
  285.   END;
  286.   SwitchGadget(FALSE,4);
  287. END Editor;
  288.  
  289. PROCEDURE SendCommand(w         : WindowPtr;
  290.                       command   : CARDINAL;
  291.                       qualifier : QualifierSet;
  292.                       code      : CARDINAL);
  293. BEGIN
  294.   news.nextEvent:=NIL;
  295.   news.class:=rawkey;
  296.   news.subClass:=null;
  297.   news.qualifier:=qualifier;
  298.   news.code:=code;
  299.  
  300.   inReqPtr^.command:=command;
  301.   inReqPtr^.message.replyPort:=ReplyPort;
  302.   inReqPtr^.length:=SIZE(InputEvent);
  303.   inReqPtr^.data:=ADR(news);
  304.  
  305.   Forbid();
  306.     ActivateWindow(w); DoIO(inReqPtr);
  307.   Permit();
  308.  
  309.   Assert(inReqPtr^.error = 0,ADR("I/O Error !"));
  310. END SendCommand;
  311.  
  312. PROCEDURE DisplayNoEnding;
  313. VAR pos : INTEGER;
  314. BEGIN
  315.   Copy(prgPtr^.BufferString[0],prgPtr^.FR.file);
  316.   pos:=LastPos(prgPtr^.BufferString[0],Length(prgPtr^.BufferString[0]),".");
  317.   IF pos # -1 THEN prgPtr^.BufferString[0,pos]:=00C; END;
  318.   RefreshGList(ADR(prgPtr^.GadgetArray[0]),prgPtr^.window,NIL,1);
  319. END DisplayNoEnding;
  320.  
  321. PROCEDURE CheckEditorFile(wb,change : BOOLEAN; w : WindowPtr): EditorCondition;
  322. VAR msgPort : MsgPortPtr;
  323.     path    : ARRAY [0..150] OF CHAR;
  324.     result  : EditorCondition;
  325.  
  326.   PROCEDURE ComparePath;
  327.   VAR ptr  : TrojaPtr;
  328.       file : ARRAY [0..31] OF CHAR;
  329.   BEGIN
  330.     SendCommand(w,writeEvent,QualifierSet{control},0DH);
  331.     WaitPort(msgPort); ptr:=CAST(TrojaPtr,GetMsg(msgPort));
  332.     IF ptr # NIL THEN
  333.        CopyMem(ptr^.path,ADR(path),149); ReplyMsg(ptr);
  334.        FilterLastDir(path,file); file[Length(file)-1]:=00C;
  335.  
  336.        IF Compare(file,prgPtr^.FR.file) # 0 THEN
  337.           result:=notchanged;
  338.           IF change THEN   (* not equal but corrected *)
  339.              Copy(prgPtr^.FR.file,file); result:=changed;
  340.           END;
  341.  
  342.           RefreshGList(ADR(prgPtr^.GadgetArray[21]),prgPtr^.window,NIL,10);
  343.           DisplayNoEnding;
  344.        ELSE
  345.           result:=correct;
  346.        END;
  347.     ELSE
  348.       result:= correct; (* no message ??! *)
  349.     END;
  350.   END ComparePath;
  351.  
  352. BEGIN
  353.   IF wb THEN
  354.      RETURN correct;
  355.   ELSE
  356.      msgPort:=CreatePort(ADR("m2c"),30);
  357.        IF (msgPort # NIL) THEN ComparePath; DeletePort(msgPort); END;
  358.      RETURN result;
  359.   END;
  360. END CheckEditorFile;
  361.  
  362. PROCEDURE Compiler(wb : BOOLEAN): BOOLEAN;
  363. VAR file,
  364.     dummy    : ARRAY [0..255] OF CHAR;
  365.     resid    : ARRAY [0..150] OF CHAR;
  366.     pos      : INTEGER;
  367.     s        : ScreenPtr;
  368.     bool     : BOOLEAN;
  369.     ed       : EditorCondition;
  370. BEGIN
  371.   SwitchGadget(TRUE,5); PrintStatus("Started Compiler !");
  372.  
  373.   IF NOT wb THEN
  374.      s:=FindEditor();
  375.      IF (s # NIL) THEN ed:=CheckEditorFile(wb,TRUE,s^.firstWindow); END;
  376.   END;
  377.  
  378.   IF (selected IN prgPtr^.GadgetArray[16].flags) THEN
  379.       MakePath(prgPtr^.BufferString[3],"",file);
  380.       TestForProject(file,"txt/",file);
  381.   ELSE
  382.       MakePath(prgPtr^.FR.dirPath,"",file);
  383.   END;
  384.   Concat(file,prgPtr^.FR.file);
  385.  
  386.   IF NOT wb THEN
  387.      s:=FindEditor();
  388.      IF s # NIL THEN
  389.         Concat(file,"E");
  390.         IF TestForFile(ADR(file)) THEN bool:=DeleteFile(ADR(file)); END;
  391.         file[Length(file)-1]:=00C;
  392.         SendCommand(s^.firstWindow,writeEvent,QualifierSet{lShift},50H);(*F1*)
  393.         Delay(5);
  394.      END;
  395.   END;
  396.  
  397.   Copy(resid,prgPtr^.BufferString[5]);
  398.   IF (checked IN prgPtr^.MenuArray[25].flags) THEN
  399.       pos:=Occurs(resid,0,"M2:",FALSE);
  400.       IF pos > -1 THEN String.Delete(resid,0,3); Delay(15); END;
  401.   END;
  402.   MakeExecuteStr(resid,file,dummy);
  403.  
  404.   IF TestForFile(ADR(file)) THEN
  405.      ExecuteStr(ADR(dummy));
  406.      SwitchGadget(FALSE,5);
  407.  
  408.      Concat(file,("E"));
  409.      IF TestForFile(ADR(file)) THEN
  410.         s:=FindEditor();
  411.         IF s # NIL THEN
  412.            CASE CheckEditorFile(wb,FALSE,s^.firstWindow) OF
  413.              correct:     Editor;
  414.            | notchanged:  Editor;
  415.                IF (s # NIL) THEN M2EmacsRequester(ADR(prgPtr^.FR.file),s) END;
  416.            ELSE
  417.            END;
  418.         END;
  419.         RETURN FALSE
  420.      ELSE
  421.        s:=FindEditor();
  422.        IF (s # NIL) THEN
  423.          SendCommand(s^.firstWindow,writeEvent,QualifierSet{lShift},51H); (*F2*)
  424.          SendCommand(s^.firstWindow,writeEvent,QualifierSet{},51H);
  425.        END;
  426.  
  427.      END;
  428.      RETURN TRUE;
  429.   ELSE
  430.     SwitchGadget(FALSE,5);
  431.     DisplayBeep(NIL); bool:=WBenchToFront(); PrintStatus("File not found!");
  432.   END;
  433.   RETURN FALSE;
  434. END Compiler;
  435.  
  436. PROCEDURE Linker(wb : BOOLEAN): BOOLEAN;
  437. VAR file,
  438.     file2,
  439.     dummy : ARRAY [0..255] OF CHAR;
  440.     resid : ARRAY [0..150] OF CHAR;
  441.     pos   : INTEGER;
  442.     i     : INTEGER;
  443.     aDate,
  444.     bDate : Date;
  445.     bool  : BOOLEAN;
  446.     s     : ScreenPtr;
  447. BEGIN
  448.   SwitchGadget(TRUE,6); PrintStatus("Started Linker !"); file:=("");
  449.  
  450.   IF (selected IN prgPtr^.GadgetArray[14].flags) THEN i:=1 ELSE i:=0 END;
  451.   IF (selected IN prgPtr^.GadgetArray[16].flags) THEN
  452.       MakePath(prgPtr^.BufferString[3],"",file);
  453.       TestForProject(file,"obj/",file);
  454.   ELSE
  455.       MakePath(prgPtr^.FR.dirPath,"",file);
  456.   END;
  457.   Concat(file,prgPtr^.BufferString[i]);
  458.  
  459.   IF (selected IN prgPtr^.GadgetArray[16].flags) THEN
  460.       MakePath(prgPtr^.BufferString[3],"",file2);
  461.       TestForProject(file2,"bin/",file2);
  462.   ELSE
  463.      MakePath(prgPtr^.FR.dirPath,"",file2); i:=0;
  464.   END;
  465.   Concat(file2,prgPtr^.BufferString[i]);
  466.  
  467.     Copy(resid,prgPtr^.BufferString[6]);
  468.     IF (checked IN prgPtr^.MenuArray[26].flags) THEN
  469.        pos:=Occurs(resid,0,"M2:",FALSE);
  470.        IF pos > -1 THEN String.Delete(resid,0,3); Delay(15) END;
  471.     END;
  472.  
  473.   IF GetFileDosDate(file2,aDate) THEN
  474.  
  475.      MakeExecuteStr(resid,file,dummy);
  476.      ExecuteStr(ADR(dummy)); SwitchGadget(FALSE,6);
  477.  
  478.      IF GetFileDosDate(file2,bDate) THEN
  479.  
  480.         IF bDate.days > aDate.days THEN
  481.            RETURN TRUE;
  482.         ELSE
  483.            IF bDate.minute > aDate.minute THEN
  484.               RETURN TRUE;
  485.            ELSE
  486.               IF bDate.tick > aDate.tick THEN
  487.                  RETURN TRUE;
  488.               END;
  489.            END;
  490.         END;
  491.      END;
  492.   END;
  493.  
  494.   IF wb THEN
  495.      M2LErrorRequester(ADR(prgPtr^.BufferString[i]),NIL);
  496.   ELSE
  497.      Editor; s:=FindEditor();
  498.      IF (s # NIL) THEN M2LErrorRequester(ADR(prgPtr^.BufferString[i]),s) END;
  499.   END;
  500.  
  501.   RETURN FALSE;
  502. END Linker;
  503.  
  504. PROCEDURE Save;
  505. VAR src,
  506.     dest,
  507.     project : ARRAY [0..255] OF CHAR;
  508.     dir     : ARRAY [0..31] OF CHAR;
  509. BEGIN
  510.   SwitchGadget(TRUE,13); PrintStatus("Save File !");
  511.  
  512.   MakePath(prgPtr^.FR.dirPath,prgPtr^.FR.file,src);
  513.   IF (selected IN prgPtr^.GadgetArray[16].flags) THEN
  514.       IF (selected IN prgPtr^.GadgetArray[16].flags) THEN
  515.          FilterLastDir(prgPtr^.BufferString[3],dir);
  516.          MakePath(prgPtr^.BufferString[2],dir,dest); dest[Length(dest)-1]:=00C;
  517.          IF NOT TestForFile(ADR(dest)) THEN
  518.             MakeExecuteStr(prgPtr^.BufferString[7],dest,project);
  519.             ExecuteStr(ADR(project));
  520.          END;
  521.         TestForProject(dest,"/txt",dest);
  522.      END;
  523.   ELSE
  524.      Copy(dest,prgPtr^.BufferString[2]);
  525.   END;
  526.   IF NOT XCopy(src,dest,single) THEN GetDosErr END;
  527.  
  528.   SwitchGadget(FALSE,13);
  529. END Save;
  530.  
  531. PROCEDURE Run;
  532. VAR file : ARRAY [0..255] OF CHAR;
  533.     i    : INTEGER;
  534.     bool : BOOLEAN;
  535. BEGIN
  536.   SwitchGadget(TRUE,7); PrintStatus("Started Program !"); file:=("");
  537.  
  538.   IF (selected IN prgPtr^.GadgetArray[14].flags) THEN i:=1 ELSE i:=0 END;
  539.   IF (selected IN prgPtr^.GadgetArray[16].flags) THEN
  540.       MakePath(prgPtr^.BufferString[3],"",file);
  541.       TestForProject(file,"bin/",file);
  542.   ELSE
  543.      MakePath(prgPtr^.FR.dirPath,"",file); i:=0;
  544.   END;
  545.   Concat(file,prgPtr^.BufferString[i]);
  546.   IF (checked IN prgPtr^.MenuArray[15].flags) THEN Save END;
  547.  
  548.   bool:=WBenchToFront();
  549.   ExecuteStr(ADR(file)); SwitchGadget(FALSE,7);
  550. END Run;
  551.  
  552. PROCEDURE Make(wb : BOOLEAN);
  553. BEGIN
  554.   SwitchGadget(TRUE,8);
  555.     IF Compiler(wb) THEN IF Linker(wb) THEN Run END; END;
  556.   SwitchGadget(FALSE,8);
  557. END Make;
  558.  
  559. PROCEDURE Print;
  560. VAR file,
  561.     dummy : ARRAY [0..255] OF CHAR;
  562. BEGIN
  563.   SwitchGadget(TRUE,15); PrintStatus("Started Printutility !");
  564.  
  565.   MakePath(prgPtr^.FR.dirPath,prgPtr^.FR.file,file);
  566.   MakeExecuteStr(prgPtr^.BufferString[11],file,dummy);
  567.  
  568.   ExecuteStr(ADR(dummy)); SwitchGadget(FALSE,15);
  569. END Print;
  570.  
  571. PROCEDURE Project(test : BOOLEAN);
  572. VAR file,
  573.     dummy : ARRAY [0..255] OF CHAR;
  574.     lock  : FileLockPtr;
  575.     bool  : BOOLEAN;
  576.  
  577.     PROCEDURE DeleteLock;
  578.     BEGIN
  579.       lock:=CurrentDir(projectLock); IF lock # NIL THEN UnLock(lock); END;
  580.       projectLock:=NIL;
  581.     END DeleteLock;
  582. BEGIN
  583.   ClearMenuStrip(prgPtr^.window);
  584.   bool:=(selected IN prgPtr^.GadgetArray[16].flags);
  585.   IF NOT test THEN bool:=NOT bool END;
  586.  
  587.   IF bool THEN
  588.      SwitchGadget(TRUE,16);
  589.      IF TestForFile(ADR(prgPtr^.BufferString[3])) THEN
  590.         PrintStatus("Project initialised !");
  591.      ELSE
  592.         PrintStatus("Project opened !");
  593.         MakeExecuteStr(prgPtr^.BufferString[7],prgPtr^.BufferString[3],dummy);
  594.         ExecuteStr(ADR(dummy));
  595.      END;
  596.      INCL(prgPtr^.MenuArray[9].flags,itemEnabled);
  597.      INCL(prgPtr^.MenuArray[18].flags,itemEnabled);
  598.      INCL(prgPtr^.MenuArray[31].flags,itemEnabled);
  599.      IF projectLock # NIL THEN DeleteLock END;
  600.      lock:=Lock(ADR(prgPtr^.BufferString[3]),accessRead);
  601.      projectLock:=CurrentDir(lock);
  602.      FastLister;
  603.   ELSE
  604.      PrintStatus("Project terminated !");
  605.      EXCL(prgPtr^.MenuArray[9].flags,itemEnabled);
  606.      EXCL(prgPtr^.MenuArray[18].flags,itemEnabled);
  607.      EXCL(prgPtr^.MenuArray[31].flags,itemEnabled);
  608.      DeleteLock; SwitchGadget(FALSE,16);
  609.   END;
  610.   Assert(SetMenuStrip(prgPtr^.window,prgPtr^.menuStripPtr),
  611.          ADR("Menu not initialisied"));
  612. END Project;
  613.  
  614. PROCEDURE NewShell;
  615. VAR dummy : ARRAY [0..20] OF CHAR;
  616. BEGIN
  617.   dummy:=("NewShell"); ExecuteStr(ADR(dummy));
  618. END NewShell;
  619.  
  620. PROCEDURE New;
  621. VAR bool : BOOLEAN;
  622. BEGIN
  623.   SwitchGadget(TRUE,18);
  624.     prgPtr^.BufferString[0]:=("");
  625.     RefreshGList(ADR(prgPtr^.GadgetArray[0]),prgPtr^.window,NIL,1);
  626.     bool:=ActivateGadget(ADR(prgPtr^.GadgetArray[0]),prgPtr^.window,NIL);
  627.   SwitchGadget(FALSE,18);
  628. END New;
  629.  
  630. PROCEDURE EditMakeFile;
  631. VAR file,
  632.     dummy : ARRAY [0..255] OF CHAR;
  633. BEGIN
  634.   MakePath(prgPtr^.BufferString[3],"m2Maker.mke",file);
  635.   MakeExecuteStr(prgPtr^.BufferString[4],file,dummy);
  636.   ExecuteStr(ADR(dummy));
  637. END EditMakeFile;
  638.  
  639. PROCEDURE CompileProject(start : ARRAY OF CHAR; all : BOOLEAN);
  640. VAR file,
  641.     dummy    : ARRAY [0..255] OF CHAR;
  642.     input    : File;
  643.     bool,err : BOOLEAN;
  644.  
  645.   PROCEDURE ReadARow(VAR name : ARRAY OF CHAR);
  646.   VAR pos       : INTEGER;
  647.       ch        : CHAR;
  648.       filefound : BOOLEAN;
  649.   BEGIN
  650.     pos:=0; ch:=00C; filefound:=FALSE;
  651.     REPEAT
  652.       ReadChar(input,ch);
  653.        CASE ch OF
  654.           "!"..":","<".."}" : name[pos]:=ch; INC(pos); filefound:=TRUE;
  655.        |  lf  : IF pos > 0 THEN filefound:=TRUE ELSE filefound:=FALSE END;
  656.        |  ";" : REPEAT ReadChar(input,ch) UNTIL (ch = lf) OR (input.eof);
  657.        |  " " :
  658.        ELSE
  659.          IF NOT input.eof THEN
  660.             err:=TRUE; PrintStatus("Error in m2Maker.mke !");
  661.          END;
  662.        END;
  663.     UNTIL ((ch = lf) AND filefound) OR input.eof;
  664.     IF pos  >  0 THEN name[pos]:=00C ELSE name[0]:=00C END;
  665.     IF input.eof THEN err:=TRUE END;
  666.   END ReadARow;
  667.  
  668.   PROCEDURE Proceed(read : BOOLEAN);
  669.   BEGIN
  670.     WHILE (((input.res = done) AND ((NOT input.eof) AND bool)) AND NOT err) DO
  671.       IF read THEN ReadARow(file) END;
  672.       IF NOT err THEN
  673.          Copy(prgPtr^.FR.file,file);
  674.            RefreshGadgets(ADR(prgPtr^.GadgetArray[21]),prgPtr^.window,NIL);
  675.            DisplayNoEnding;
  676.          bool:=Compiler(TRUE); read:=TRUE;
  677.       END;
  678.     END;
  679.   END Proceed;
  680.  
  681. BEGIN
  682.   PrintStatus("Compile Project !"); bool:=TRUE; err:=FALSE;
  683.   MakePath(prgPtr^.BufferString[3],"m2Maker.mke",dummy);
  684.  
  685.   Lookup(input,dummy,1024,FALSE);
  686.     IF (input.res = done) THEN
  687.        IF all THEN
  688.           Proceed(TRUE);
  689.        ELSE
  690.          ReadARow(file);
  691.          WHILE (Compare(file,start) # 0) AND (NOT input.eof) DO
  692.            ReadARow(file);
  693.          END;
  694.          IF NOT input.eof THEN
  695.             Proceed(FALSE);
  696.          ELSE
  697.             PrintStatus("Startfile not found !");
  698.          END;
  699.       END;
  700.     ELSE
  701.       PrintStatus("m2Maker.mke file not found !");
  702.     END;
  703.  Close(input);
  704. END CompileProject;
  705.  
  706. PROCEDURE SmallWindow;
  707. VAR pos  : INTEGER;
  708.     bool : BOOLEAN;
  709. BEGIN
  710.   IF bigWindow THEN
  711.      bigWindow:=FALSE;
  712.      WITH prgPtr^.window^ DO
  713.        MoveWindow(prgPtr^.window,-1 * leftEdge,-1 * topEdge);
  714.        SizeWindow(prgPtr^.window,-280,28-windowHeight); Delay(5);
  715.      END;
  716.      BeginRefresh(prgPtr^.window);
  717.        WindowToFront(prgPtr^.window); Delay(5);
  718.      EndRefresh(prgPtr^.window,bool);
  719.      Delay(5);
  720.   ELSE
  721.      bigWindow:=TRUE;
  722.      Block(prgPtr^.window^.rPort,0,3,12,637,windowHeight-3);
  723.      pos:=RemoveGList(prgPtr^.window,ADR(prgPtr^.GadgetArray[0]),32);
  724.      WITH prgPtr^.window^ DO
  725.        MoveWindow(prgPtr^.window,-1 * leftEdge,-1 * topEdge);
  726.        SizeWindow(prgPtr^.window,280,windowHeight-28); Delay(5);
  727.      END;
  728.      WindowToFront(prgPtr^.window); Delay(5);
  729.      BeginRefresh(prgPtr^.window);
  730.        RefreshDrawings; RefreshDisplay(ADR(prgPtr^.FR)); Delay(5);
  731.      EndRefresh(prgPtr^.window,bool);
  732.      Delay(5);
  733.      pos:=AddGList(prgPtr^.window,ADR(prgPtr^.GadgetArray[0]),pos,32,NIL);
  734.      RefreshGadgets(ADR(prgPtr^.GadgetArray[0]),prgPtr^.window,NIL);
  735.   END;
  736. END SmallWindow;
  737.  
  738. PROCEDURE BonusTrack(str : ARRAY OF CHAR);
  739. VAR file,
  740.     dummy : ARRAY [0..255] OF CHAR;
  741.     i     : INTEGER;
  742. BEGIN
  743.   PrintStatus("Started User Track");
  744.  
  745.   MakePath(prgPtr^.FR.dirPath,prgPtr^.FR.file,file);
  746.   MakeExecuteStr(str,file,dummy);
  747.  
  748.   ExecuteStr(ADR(dummy));
  749. END BonusTrack;
  750.  
  751. PROCEDURE ExclChecked(nr : CARDINAL);
  752. VAR bool : BOOLEAN;
  753. BEGIN
  754.  ClearMenuStrip(prgPtr^.window);
  755.    EXCL(prgPtr^.MenuArray[nr].flags,checked);
  756.  bool:=SetMenuStrip(prgPtr^.window,prgPtr^.menuStripPtr);
  757. END ExclChecked;
  758.  
  759. PROCEDURE InclChecked(nr : CARDINAL);
  760. VAR bool : BOOLEAN;
  761. BEGIN
  762.  ClearMenuStrip(prgPtr^.window);
  763.    INCL(prgPtr^.MenuArray[nr].flags,checked);
  764.  bool:=SetMenuStrip(prgPtr^.window,prgPtr^.menuStripPtr);
  765. END InclChecked;
  766.  
  767. PROCEDURE ByeByeFastLister;
  768. VAR msg        : InEvent;
  769.     ptr,
  770.     replyPort  : MsgPortPtr;
  771. BEGIN
  772.   ptr:=FindPort(ADR("FastLister_Port"));
  773.   IF (ptr # NIL) THEN
  774.      replyPort:=CreatePort(NIL,0);
  775.      IF replyPort # NIL THEN
  776.         msg.event.code:=45H;                               (* ESC *)
  777.         msg.event.qualifier:=QualifierSet{lShift,control};
  778.         msg.news.node.type:=ExecD.message;
  779.         msg.news.length:=SIZE(InputEvent);
  780.         msg.news.replyPort:=replyPort;
  781.  
  782.         PutMsg(ptr,ADR(msg));
  783.  
  784.        WHILE (FindPort(ADR("FastLister_Port")) # NIL) DO END;
  785.        DeletePort(replyPort);
  786.     END;
  787.     PrintStatus("FastLister removed.");
  788.   END;
  789. END ByeByeFastLister;
  790.  
  791. PROCEDURE FastLister;
  792. VAR dummy : ARRAY [0..255] OF CHAR;
  793. BEGIN
  794.   ByeByeFastLister;
  795.   PrintStatus("Install FastLister !");
  796.     dummy:=("Run M2:FastLister "); Concat(dummy,prgPtr^.BufferString[12]);
  797.   ExecuteStr(ADR(dummy));
  798. END FastLister;
  799.  
  800. PROCEDURE ByeByeCompiler;
  801. VAR base     : IntuitionBasePtr;
  802.     w        : WindowPtr;
  803.     name     : ARRAY [0..30] OF CHAR;
  804.     ilock    : LONGCARD;
  805.     notFound,
  806.     bool     : BOOLEAN;
  807. BEGIN
  808.   base:=ADR(IntuitionL); w:=NIL; bool:=WBenchToFront();
  809.   ilock:=LockIBase(0);
  810.     w:=base^.firstScreen^.firstWindow;
  811.   UnlockIBase(ilock);
  812.   notFound:=TRUE;
  813.   WHILE (w # NIL) AND notFound DO
  814.     CopyMem(w^.title,ADR(name),27); name[27]:=00C;
  815.     IF Compare("Interactive Compiler m2:m2c",name) = 0 THEN
  816.        notFound:=FALSE;
  817.     ELSE
  818.        w:=w^.nextWindow;
  819.     END;
  820.   END;
  821.   IF w # NIL THEN
  822.      SendCommand(w,writeEvent,QualifierSet{},43H); ExclChecked(17);
  823.      PrintStatus("Inactive Compiler removed.");
  824.   END;
  825. END ByeByeCompiler;
  826.  
  827. PROCEDURE ByeByeDebug;
  828. BEGIN
  829.  ExecuteStr(ADR(prgPtr^.BufferString[9])); ExclChecked(29);
  830.  PrintStatus("Debugger removed.");
  831. END ByeByeDebug;
  832.  
  833. PROCEDURE ByeByePool;
  834. VAR base     : IntuitionBasePtr;
  835.     w        : WindowPtr;
  836.     name     : ARRAY [0..30] OF CHAR;
  837.     ilock    : LONGCARD;
  838.     notFound,
  839.     bool     : BOOLEAN;
  840. BEGIN
  841.   base:=ADR(IntuitionL); w:=NIL; bool:=WBenchToFront();
  842.   ilock:=LockIBase(0);
  843.     w:=base^.firstScreen^.firstWindow;
  844.   UnlockIBase(ilock);
  845.   notFound:=TRUE;
  846.   WHILE (w # NIL) AND notFound DO
  847.     CopyMem(w^.title,ADR(name),27); name[27]:=00C;
  848.     IF Compare("Interactive Pool m2:m2Pool",name) = 0 THEN
  849.        notFound:=FALSE;
  850.     ELSE
  851.        w:=w^.nextWindow;
  852.     END;
  853.   END;
  854.   IF w # NIL THEN
  855.      SendCommand(w,writeEvent,QualifierSet{},43H); ExclChecked(28);
  856.      PrintStatus("Interactive Pool removed.");
  857.   END;
  858.  
  859. END ByeByePool;
  860.  
  861. PROCEDURE ByeByeM2Ohm;
  862. VAR msg        : InEvent;
  863.     ptr,
  864.     replyPort  : MsgPortPtr;
  865. BEGIN
  866.   ptr:=FindPort(ADR("OHM"));
  867.   IF (ptr # NIL) THEN
  868.      replyPort:=CreatePort(NIL,0);
  869.      IF replyPort # NIL THEN
  870.         msg.event.code:=45H;                               (* ESC *)
  871.         msg.event.qualifier:=QualifierSet{lAlt};
  872.         msg.news.node.type:=ExecD.message;
  873.         msg.news.length:=SIZE(InputEvent);
  874.         msg.news.replyPort:=replyPort;
  875.  
  876.         PutMsg(ptr,ADR(msg));
  877.  
  878.        WHILE (FindPort(ADR("OHM")) # NIL) DO END;
  879.        DeletePort(replyPort);
  880.     END;
  881.     PrintStatus("M2Ohm removed."); ExclChecked(30);
  882.   END;
  883. END ByeByeM2Ohm;
  884.  
  885. PROCEDURE InteractiveCompiler;
  886. VAR file   : File;
  887.     actual : LONGINT;
  888.     dummy,
  889.     scan   : ARRAY [0..100] OF CHAR;
  890.  
  891.     PROCEDURE Scan;
  892.     VAR i : INTEGER;
  893.     BEGIN
  894.       i:=0;
  895.       WHILE (prgPtr^.BufferString[5,i] # 00C) AND
  896.             (prgPtr^.BufferString[5,i] # "#")     DO
  897.             scan[i]:=prgPtr^.BufferString[5,i]; INC(i);
  898.       END;
  899.       scan[i]:=00C;
  900.     END Scan;
  901. BEGIN
  902.   IF (checked IN prgPtr^.MenuArray[17].flags) THEN
  903.      IF FindPort(ADR("m2c")) = NIL THEN
  904.         PrintStatus("Start Compiler interactive !");
  905.         Lookup(file,"T:m2Maker.m2c",1024,TRUE);
  906.         IF file.res = done THEN
  907.            scan:=(""); Scan;
  908.            WriteBytes(file,ADR(scan),Length(scan),actual); WriteChar(file,lf);
  909.            WriteBytes(file,ADR("EndCli >NIL: "),15,actual); WriteChar(file,lf);
  910.            Close(file);
  911.         dummy:=('Newshell "NEWCON:0/0/320/24/Interactive Compiler m2:m2c"')+
  912.                 ' FROM T:m2Maker.m2c';
  913.            ExecuteStr(ADR(dummy));
  914.            WindowToFront(prgPtr^.window); Delay(5);
  915.         ELSE
  916.            PrintStatus("Compiler installation failed !");
  917.         END;
  918.      END;
  919.   ELSE
  920.     ByeByeCompiler;
  921.   END;
  922. END InteractiveCompiler;
  923.  
  924. PROCEDURE KeyMaker;
  925. VAR file,
  926.     dummy : ARRAY [0..255] OF CHAR;
  927.     i     : INTEGER;
  928.     in    : BOOLEAN;
  929. BEGIN
  930.   PrintStatus("Started Keycompilation !"); file:=(""); in:=FALSE;
  931.  
  932.   IF (selected IN prgPtr^.GadgetArray[14].flags) THEN i:=1 ELSE i:=0 END;
  933.       MakePath(prgPtr^.FR.dirPath,"",file);
  934.   IF (selected IN prgPtr^.GadgetArray[16].flags) THEN
  935.       TestForProject(file,"txt/",file);
  936.   END;
  937.   IF (checked IN prgPtr^.MenuArray[17].flags) THEN ByeByeCompiler; in:=TRUE END;
  938.  
  939.   MakePath(prgPtr^.FR.dirPath,prgPtr^.BufferString[i],file);
  940.   MakeExecuteStr(prgPtr^.BufferString[13],file,dummy);
  941.  
  942.   ExecuteStr(ADR(dummy));
  943.  
  944.   IF in THEN InclChecked(17); InteractiveCompiler; END;
  945. END KeyMaker;
  946.  
  947. BEGIN
  948.   bigWindow:=TRUE;
  949.  
  950.   inputPort:=CreatePort(NIL,0);
  951.     Assert(inputPort # NIL,ADR("Couldn't open MsgPort"));
  952.   inReqPtr:=CreateStdIO(inputPort);
  953.     Assert(inReqPtr # NIL,ADR("StdIO not installed !"));
  954.   ReplyPort:=CreatePort(NIL,0);
  955.     Assert(ReplyPort # NIL,ADR("Couldn't open MsgPort"));
  956.  
  957.   OpenDevice(ADR(inputName),0,inReqPtr,LONGSET{});
  958.  
  959. CLOSE
  960.   IF projectLock # NIL THEN
  961.      lock:=CurrentDir(projectLock); IF lock # NIL THEN UnLock(lock); END;
  962.   END;
  963.  
  964.   ByeByeFastLister; ByeByeCompiler; ByeByeDebug; ByeByePool; ByeByeM2Ohm;
  965.  
  966.   IF inReqPtr # NIL THEN
  967.      CloseDevice(inReqPtr); DeleteStdIO(inReqPtr);   inReqPtr:=NIL;
  968.   END;
  969.   IF inputPort   # NIL THEN DeletePort(inputPort);   inputPort:=NIL;   END;
  970.   IF ReplyPort   # NIL THEN DeletePort(ReplyPort);   ReplyPort:=NIL;   END;
  971.  
  972.   Lookup(file,"T:m2Maker.m2c",0,FALSE);
  973.     IF file.res = done THEN Delete(file); END; Close(file);
  974.  
  975.   Lookup(file,"T:m2Maker.m2d",0,FALSE);
  976.     IF file.res = done THEN Delete(file); END; Close(file);
  977.  
  978.   Lookup(file,"T:m2Maker.m2p",0,FALSE);
  979.     IF file.res = done THEN Delete(file); END; Close(file);
  980.  
  981. END Routines.
  982.  
  983.